import matplotlib.pyplot as plt
from binance.client import Client
import os
from datetime import datetime, timedelta, time

api_key = 'cZ4N52VT4v774e7Cd9IM1SLhRxGLGqsSv36AG3es0siOghP4Rm2Yyzo4NXinZKkD'
api_secret = 'W3tMsZGdihf1qDGwOtUcDbQNoN6ecjvC2mYqdeHcqYYIcflrpuk8a3IbIcG5L215'
client = Client(api_key, api_secret)
def alert_if_volume_high():
    # 获取当前时间和7小时前的时间
    end_time = datetime.utcnow()
    start_time = end_time - timedelta(hours=7)
    start_str = start_time.strftime("%Y-%m-%dT%H:%M:%SZ")
    end_str = end_time.strftime("%Y-%m-%dT%H:%M:%SZ")

    # 获取当前时间至7小时前的BNB/USDT期货的K线数据，每小时一条数据
    klines = client.futures_historical_klines("BNBUSDT", Client.KLINE_INTERVAL_1HOUR, start_str, end_str)

    # 计算平均成交量以设定阈值
    if len(klines) > 0:
        total_volume = sum([float(kline[5]) for kline in klines])
        average_volume = total_volume / len(klines)
        threshold = 1.5 * average_volume  # 设置阈值为平均成交量的150%

        # 检查最近一小时的成交量是否接近阈值
        current_volume = float(klines[-1][5])
        if current_volume >= 0.9 * threshold:
            while True:  # 当成交量接近或超过阈值时不断报警
                print(f'报警：当前成交量为 {current_volume}，接近或超过放量阈值。')
                time.sleep(10)  # 每10秒报警一次
def getAverageTradeVolume():
    # 当前时间
    current_time = datetime.utcnow()

    # 存储时间和成交量
    times = []
    volumes = []

    # 对过去100个小时，每小时获取一次7小时的平均成交量
    for i in range(100):
        start_time = current_time - timedelta(hours=i + 7)  # 当前时间向前推i+7小时
        end_time = current_time - timedelta(hours=i)  # 当前时间向前推i小时
        start_str = start_time.strftime("%Y-%m-%dT%H:%M:%SZ")
        end_str = end_time.strftime("%Y-%m-%dT%H:%M:%SZ")

        # 获取7小时内的BNB/USDT期货的K线数据，每小时一条数据
        klines = client.futures_historical_klines("BNBUSDT", Client.KLINE_INTERVAL_1HOUR, start_str, end_str)

        # 计算平均成交量
        if len(klines) > 0:
            total_volume = sum([float(kline[5]) for kline in klines])
            average_volume = total_volume / len(klines)
            times.append(end_time)
            volumes.append(average_volume)
        else:
            print(f'{end_time.strftime("%Y-%m-%d %H:%M:%S")} 没有可用数据。')

    # 计算放量阈值（例如，平均值的150%）
    threshold = 1.5 * sum(volumes) / len(volumes)

    # 检测并报警
    for time, volume in zip(times, volumes):
        if volume >= 0.9 * threshold:  # 当成交量达到阈值的90%时发出警报
            print(f'报警：{time.strftime("%Y-%m-%d %H:%M:%S")} 的成交量为 {volume}，接近放量阈值。')

    # 绘制成交量曲线图
    plt.figure(figsize=(14, 7))
    plt.plot(times, volumes, label='7小时平均成交量')
    plt.axhline(y=threshold, color='r', linestyle='-', label='放量阈值')

    plt.title('BNB/USDT 7小时平均成交量及放量阈值')
    plt.xlabel('时间')
    plt.ylabel('平均成交量')
    plt.legend()
    plt.grid(True)
    plt.gca().invert_xaxis()  # 时间逆序显示
    plt.show()

    alert_if_volume_high()


